package com.pudu.mydemo.utils;

import android.graphics.Point;

/**
 * Created by pingfan on 16/7/17.
 */
public class PointToLineDis {

    // 直线方程一般式 Ax + By + C = 0;

    private double A;

    private double B;

    private double C;

    /**
     * 求直线方程的一般式
     *
     * @param point1
     * @param point2
     *            直线l经过的两个点
     */
    public void lineExp(Point point1, Point point2) {
        /**
         * 由起始点和终止点构成的直线方程一般式的系数A
         */
        A = (point1.x - point2.y)
                / Math.sqrt(Math.pow((point1.y - point2.y), 2)
                + Math.pow((point1.x - point2.x), 2));

        /**
         * 由起始点和终止点构成的直线方程一般式的系数
         */
        B = (point2.x - point1.x)
                / Math.sqrt(Math.pow((point1.y - point2.y), 2)
                + Math.pow((point1.x - point2.x), 2));

        /**
         * 由起始点和终止点构成的直线方程一般式的系数
         */
        C = (point1.x * point2.y - point2.x * point1.y)
                / Math.sqrt(Math.pow((point1.y - point2.y), 2)
                + Math.pow((point1.x - point2.x), 2));

    }

    /**
     * 点到直线方程的距离 此公式需要证明
     *
     * @param x
     * @param y
     * @return
     */
    public double alLine(double x, double y) {
        double d = Math.abs(A * (x) + B * (y) + C)/Math.sqrt(Math.pow(A,2)+Math.pow(B,2));
        return d;
    }

    /**
     * 点到线段的距离 计算线段和计算点到直线的距离类似，不同Y点在包含l线段的投影可能不是线段上的点，投影可能在起点之前或者终点之后
     *
     * @param x
     * @param y
     * @return
     */
    public double alSegmentDis(double x, double y, Point point1, Point point2) {
        double dis = 0;
        double a, b, c;
        a = lineDis(point1.x, point1.y, point2.x, point2.y);// 线段的长度
        b = lineDis(point1.x, point1.y, x, y); // point1到点的距离
        c = lineDis(point2.x, point2.y, x, y);//point2到点的距离
        if (c + b == a) {// 点在线段上
            dis = 0;
            return dis;
        }
        if (c * c >= a * a + b * b) { // 组成直角三角形或钝角三角形，投影在point1延长线上，
            dis = b;
            return dis;
        }
        if (b * b >= a * a + c * c) {// 组成直角三角形或钝角三角形，投影在point2延长线上，
            dis = c;
            return dis;
        }
        // 组成锐角三角形，则求三角形的高
        double p = (a + b + c) / 2;// 半周长
        double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));// 海伦公式求面积
        dis = 2 * s / a;// 返回点到线的距离（利用三角形面积公式求高）
        return dis;
    }

    /**
     * 计算两点之间的距离
     * @param x1
     * @param y1
     * @param x2
     * @param y2
     * @return
     */
    private double lineDis(double x1, double y1, double x2, double y2) {
        double lineLength = 0;
        lineLength = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        return lineLength;
    }

    /**
     * 计算两点斜率的角度
     * @param point1
     * @param point2
     * @return
     */
    public int getDegree(Point point1, Point point2)
    {
        int Degree = 0;

        int x=point1.x-point2.x;
        int y=point1.y-point2.y;
        double z=Math.sqrt(x*x+y*y);

        Degree = Math.round((float)(Math.asin(Math.abs(y)/z)/Math.PI*180));
        if(x*y < 0)
        {
            Degree = 180 - Degree;
        }

        return Degree;
    }


}

